Jackson JSON থেকে Java Object তৈরি করার সময় Multiple Constructors থাকলে কোন কনস্ট্রাক্টর ব্যবহার করা হবে তা Jackson Annotations দিয়ে নির্ধারণ করা যায়।
1. Default Behavior
Jackson ডিফল্টভাবে নো-আর্গ কনস্ট্রাক্টর (No-Args Constructor) ব্যবহার করে। যদি নো-আর্গ কনস্ট্রাক্টর না থাকে, তবে এটি ব্যর্থ হবে।
Example Without Annotations:
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) throws Exception {
String json = """
{
"id": 101,
"name": "John Doe",
"email": "john.doe@example.com"
}
""";
ObjectMapper objectMapper = new ObjectMapper();
User user = objectMapper.readValue(json, User.class);
System.out.println("User Name: " + user.name);
}
}
class User {
public int id;
public String name;
public String email;
// Constructor 1
public User() {} // Default constructor
// Constructor 2
public User(int id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
}
আউটপুট:
User Name: John Doe
2. Multiple Constructors Handling
যদি একাধিক কনস্ট্রাক্টর থাকে, তখন Jackson বুঝবে না কোনটি ব্যবহার করতে হবে। এটি সমাধান করতে @JsonCreator এবং @JsonProperty ব্যবহার করা হয়।
3. @JsonCreator দিয়ে Constructor নির্বাচন
@JsonCreator অ্যানোটেশন একটি নির্দিষ্ট কনস্ট্রাক্টরকে JSON ডেসিরিয়ালাইজেশনের জন্য নির্বাচন করে।
Example with @JsonCreator:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
class User {
public int id;
public String name;
public String email;
// Constructor 1 (Default)
public User() {}
// Constructor 2 (Selected for JSON Mapping)
@JsonCreator
public User(@JsonProperty("id") int id,
@JsonProperty("name") String name,
@JsonProperty("email") String email) {
this.id = id;
this.name = name;
this.email = email;
}
}
Deserialization Example:
public class Main {
public static void main(String[] args) throws Exception {
String json = """
{
"id": 101,
"name": "John Doe",
"email": "john.doe@example.com"
}
""";
ObjectMapper objectMapper = new ObjectMapper();
User user = objectMapper.readValue(json, User.class);
System.out.println("User Name: " + user.name);
}
}
আউটপুট:
User Name: John Doe
4. Complex Example: Multiple Constructors
মডেল ক্লাস:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
class Product {
public int id;
public String name;
public double price;
// Default Constructor
public Product() {}
// Constructor 1
@JsonCreator
public Product(@JsonProperty("id") int id,
@JsonProperty("name") String name) {
this.id = id;
this.name = name;
}
// Constructor 2
public Product(int id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
}
Deserialization Example:
public class Main {
public static void main(String[] args) throws Exception {
String json = """
{
"id": 101,
"name": "Laptop"
}
""";
ObjectMapper objectMapper = new ObjectMapper();
Product product = objectMapper.readValue(json, Product.class);
System.out.println("Product Name: " + product.name);
System.out.println("Product Price: " + product.price); // Will remain 0.0
}
}
আউটপুট:
Product Name: Laptop
Product Price: 0.0
5. @JsonProperty দিয়ে Field Mapping নিশ্চিত করা
@JsonProperty ব্যবহার করে JSON ফিল্ড এবং কনস্ট্রাক্টরের প্যারামিটারগুলোর মধ্যে সুনির্দিষ্ট ম্যাপিং নিশ্চিত করা হয়।
Example:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
class Employee {
public int employeeId;
public String employeeName;
@JsonCreator
public Employee(@JsonProperty("id") int employeeId,
@JsonProperty("name") String employeeName) {
this.employeeId = employeeId;
this.employeeName = employeeName;
}
}
Deserialization Example:
public class Main {
public static void main(String[] args) throws Exception {
String json = """
{
"id": 201,
"name": "Alice"
}
""";
ObjectMapper objectMapper = new ObjectMapper();
Employee employee = objectMapper.readValue(json, Employee.class);
System.out.println("Employee ID: " + employee.employeeId);
System.out.println("Employee Name: " + employee.employeeName);
}
}
আউটপুট:
Employee ID: 201
Employee Name: Alice
6. Lombok এবং Jackson একসাথে ব্যবহার
যদি আপনি Lombok ব্যবহার করেন, তাহলে @AllArgsConstructor বা @RequiredArgsConstructor এর সঙ্গে Jackson এর অ্যানোটেশন ব্যবহার করতে পারেন।
Example with Lombok:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor(onConstructor = @__(@JsonCreator))
public class Department {
@JsonProperty("id")
private int id;
@JsonProperty("name")
private String name;
}
Deserialization Example:
public class Main {
public static void main(String[] args) throws Exception {
String json = """
{
"id": 501,
"name": "HR"
}
""";
ObjectMapper objectMapper = new ObjectMapper();
Department department = objectMapper.readValue(json, Department.class);
System.out.println("Department ID: " + department.getId());
System.out.println("Department Name: " + department.getName());
}
}
আউটপুট:
Department ID: 501
Department Name: HR
Key Points
- Multiple Constructors হ্যান্ডল করা:
- @JsonCreator ব্যবহার করে নির্দিষ্ট Constructor নির্বাচন করুন।
- @JsonProperty ব্যবহার করে JSON ফিল্ড এবং Constructor প্যারামিটার ম্যাপিং নিশ্চিত করুন।
- Default Constructor প্রয়োজনীয়:
- Jackson ডিফল্টভাবে নো-আর্গ কনস্ট্রাক্টর ব্যবহার করে, এটি না থাকলে @JsonCreator দিয়ে নির্দেশ করতে হবে।
- Lombok Integration:
- Lombok এবং Jackson একত্রে ব্যবহার করা হলে কনস্ট্রাক্টর অ্যানোটেশন সঠিকভাবে প্রয়োগ করুন।
এই পদ্ধতিগুলো অনুসরণ করে আপনি Jackson-এ Multiple Constructors সহ JSON Mapping সফলভাবে হ্যান্ডল করতে পারবেন।
Read more